﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Seagull.Foundation
{
    /// <summary>
    /// 服务总线的接口标准
    /// </summary>
    public interface IServiceBus
    {
        /// <summary>
        /// 单播消息传输，也就是一对一的消息传递，一个消息对应一个消息处理。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name">处理程序的标识符</param>
        /// <param name="content">将被序列化的消息正文内容。(可以为空)</param>
        /// <param name="headers">消息附加头。</param>
        /// <returns></returns>
        Task Send<T>(string name, T content, IDictionary<string, string?>? headers = null);

        /// <summary>
        /// 发送延时任务(单播消息传输，一个消息对应一个消息处理)。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name">处理程序的标识符</param>
        /// <param name="content">将被序列化的消息正文内容。(可以为空)</param>
        /// <param name="delay">延时时间。(多久之后进行处理)</param>
        /// <param name="headers">消息附加头。</param>
        /// <returns></returns>
        Task Delay<T>(string name, T content, TimeSpan delay, IDictionary<string, string?>? headers = null);

        /// <summary>
        /// 多播消息传输，也就是一对多的消息传递，一个消息对应多个消息处理。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name">处理程序的标识符</param>
        /// <param name="content">将被序列化的消息正文内容。(可以为空)</param>
        /// <param name="headers">消息附加头。</param>
        /// <returns></returns>
        Task Publish<T>(string name, T content, IDictionary<string, string?>? headers = null);
    }
}
